package co.com.ticci.autolavado.general;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import co.com.ticci.autolavado.interfaces.IAcciones;

public class ManejoTransacciones  implements IAcciones
{
	private EntityManager em;
	
	public ManejoTransacciones()
	{
		em = Conexion.getConexion().getEntityManager();
	}
	
	@Override
	public String gestionarInformacion(List<? extends Object> insertables, List<? extends Object> eliminables,List<? extends Object> actualizables) 
	{
		String rpta = "OK";
		
		try 
		{			
			em.getTransaction().begin();
			
			for (int i = 0; i < eliminables.size(); i++) 
			{
				em.remove(eliminables.get(i));
			}
			
			em.flush();
			
			for (int i = 0; i < insertables.size(); i++) 
			{
				em.persist(insertables.get(i));
			}

			
			for (int i = 0; i < actualizables.size(); i++) 
			{
				em.merge(actualizables.get(i));
			}
			
			em.getTransaction().commit();
		} 
		catch (Exception e) 
		{
			rpta = "FAIL";
			e.printStackTrace();
		}
		
		return rpta;
	}
	
	@SuppressWarnings("rawtypes")
	/**
	 * 
	 * @param String consulta SQL
	 * @param Tipo de clase que retorna
	 * @param Parametros (Siempre debe empezar la llave en 0)
	 * @return Lista de Objetos de la clase enviada
	 */
	public List consultarListaGenericaNativeQuery(String consulta,Class clase, Map<Integer,Object> parametros)
	{
		
		List listaRetorno = null;
		
		try 
		{
		
			Query query = em.createNativeQuery(consulta, clase);
			
			em.clear();
			
			if(parametros != null)
			{			
				for (int i = 0; i < parametros.size(); i++) 
				{
					query.setParameter(i+1, parametros.get(i));
				}
			}
				
			listaRetorno = query.getResultList();
		
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		
		return listaRetorno;
	}
	
	@SuppressWarnings("rawtypes")
	/**
	 * 
	 * @param String consulta SQL
	 * @param Tipo de clase que retorna
	 * @param Parametros (Siempre debe empezar la llave en 0)
	 * @return
	 */
	public Object consultarObjetoSimple(String consulta,Class clase, Map<Integer,Object> parametros)
	{
		
		Object objetoRetorno = null;
		
		try 
		{
		
			Query query = em.createNativeQuery(consulta);
		
			em.clear();
			
			if(parametros != null)
			{			
				for (int i = 0; i < parametros.size(); i++) 
				{
					query.setParameter(i+1, parametros.get(i));
				}
			}
				
			objetoRetorno = query.getSingleResult();
			
		
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		
		return objetoRetorno;
	}
	
	
	
	
}
